//
//  Operator_Overloading.hpp
//  learnC++
//
//  Created by apple on 2018/6/4.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef Operator_Overloading_hpp
#define Operator_Overloading_hpp

#include <stdio.h>
#include <iostream>

//编译包含运算符的表达式时，编译器使用以下规则：
//如果所有操作数都是基本数据类型，编译器将调用内置例程（如果存在）。 如果不存在，编译器将产生编译器错误。
//如果任何操作数是用户数据类型（例如，您的类之一或枚举类型），则编译器会查看该类型是否具有可以调用的匹配的重载操作符函数。 如果找不到它，它会尝试将一个或多个用户定义类型操作数转换为基本数据类型，以便它可以使用匹配的内置操作符（通过重载的类型转换，稍后我们将介绍它 本章）。 如果失败了，那么它会产生一个编译错误。

class CentsTwo
{
private:
    int m_cents;
    
public:
    CentsTwo(int cents) { m_cents = cents; }
    
    // add CentsTwo + CentsTwo using a friend function
    
    //通过friend函数来实现操作符重载
    //对象+对象
    friend CentsTwo operator+(const CentsTwo &c1,const CentsTwo &c2);
    friend CentsTwo operator-(const CentsTwo &c1,const CentsTwo &c2);
    
    //对象+基本类型
    friend CentsTwo operator+(const CentsTwo &c1, int value);
    friend CentsTwo operator+(int value, const CentsTwo &c1);
    
    int getCents() const { return m_cents; }
};


/*
 调用
 CentsTwo c1(1);
 CentsTwo c2(3);
 
 CentsTwo c3 = 2 + c1 + 1;
 
 std::cout << c3.getCents()<< "kk\n";
 
 */

//公约数分子
//int gcd(int a, int b) {
//    return (b == 0) ? (a > 0 ? a : -a) : gcd(b, a % b);
//}

#endif /* Operator_Overloading_hpp */
